<?php

namespace common\components\wechat\mp;

use yii\base\Model;

/**
 * 退款模型
 * @package common\components\wechat\components\mp
 */
class Refund extends Model {

    /**
     * 公众账号ID
     * 微信分配的公众账号ID（企业号corpid即为此appId）
     * @var String(32)
     */
    public $appid;

    /**
     * 商户号
     * 微信支付分配的商户号
     * @var String(32)
     */
    public $mch_id;

    /**
     * 签名类型
     * 签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
     * 否
     * @var String(32)
     */
    public $sign_type;

    /**
     * 微信订单号
     * 微信生成的订单号，在支付通知中有返回
     * @var String(32)
     * 二选一	
     */
    public $transaction_id;

    /**
     * 商户订单号
     * 商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。
     * @var String(32)
     */
    public $out_trade_no;

    /**
     * 商户退款单号
     * 商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
     * @var String(64)
     */
    public $out_refund_no;

    /**
     * 订单金额
     * 订单总金额，单位为分，只能为整数，详见支付金额
     * @var Int
     */
    public $total_fee;

    /**
     * 退款金额
     * 退款总金额，订单总金额，单位为分，只能为整数，详见支付金额
     * @var Int
     */
    public $refund_fee;

    /**
     * 货币种类
     * 货币类型，符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
     * @var String(8) CNY	
     * @var Int
     */
    public $refund_fee_type;

    /**
     * 退款原因
     * 商品已售完 	若商户传入，会在下发给用户的退款消息中体现退款原因
     * @var String(80)
     */
    public $refund_desc;

    /**
     * 退款资金来源
     * REFUND_SOURCE_RECHARGE_FUNDS
     * @var String(30)
     */
    public $refund_account;

    /**
     * 签名
     * 签名，详见签名生成算法
     * @var String(32)
     */
    public $sign = null;

    /**
     * 随机字符串
     * 随机字符串，不长于32位。推荐随机数生成算法
     * @var String(32)
     */
    public $nonce_str = null;

    /**
     * @inheritdoc
     * @throws InvalidConfigException
     */
    public function init() {
        if ($this->nonce_str === null) {
            $this->setNonceStr();
        }
    }

    /**
     * 微信服务器请求签名检测
     * @param string $signature 微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
     * @param string $timestamp 时间戳
     * @param string $nonce 随机数
     * @return bool
     */
    public function setNonceStr($nonce_str = null) {
        if ($nonce_str === null) {
            $nonce_str = \common\helpers\Utils::random(32);
        }
        return $this->nonce_str = $nonce_str;
    }

}
